package com.catazzz.springbootstudy.service;

import com.catazzz.springbootstudy.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @作者: Tao
 * @日期: 2024/12/30
 * @时间: 10:14
 * @描述: 用户信息 服务类 <br><pre>
 *     1.findByName(name) - 根据姓名查询用户
 *     2.addWithRequired(user) - 使用REQUIRED传播机制添加用户
 *     3.addWithRequiredAndException(user) - 使用REQUIRED传播机制添加用户并抛出异常
 *     4.addWithRequiredNew(user) - 使用REQUIRED_NEW传播机制添加用户
 *     5.addWithRequiredNewAndException(user) - 使用REQUIRED_NEW传播机制添加用户并抛出异常
 *     6.addWithNested(user) - 使用NESTED传播机制添加用户
 *     7.addWithNestedAndException(user) - 使用NESTED传播机制添加用户并抛出异常
 *
 *      propagation = Propagation.REQUIRED:
 *          开启事务：确保方法在事务中执行。
 *          传播行为：如果当前存在事务，则加入该事务；如果没有事务，则创建一个新事务
 *      propagation = Propagation.REQUIRES_NEW:
 *          开启新事务：无论当前是否存在事务，都会创建一个新的事务来执行方法。
 *          独立提交或回滚：新事务独立于外部事务，即使外部事务失败，新事务也可以成功提交；反之亦然
 *      propagation = Propagation.NESTED:
 *          事务管理：确保方法在事务中执行。
 *          嵌套事务：如果当前存在事务，则创建一个嵌套事务；如果不存在，则创建一个新的事务
 *
 */
public interface UserService extends IService<User> {

    /**
     * 根据姓名查询用户
     * @param name 用户姓名
     * @return 用户列表
     */
    List<User> findByName(String name);

    /**
     * 添加用户
     * @param user 用户信息
     */
    @Transactional(propagation = Propagation.REQUIRED)
    void addWithRequired(User user);

    /**
     * 添加用户并抛出异常
     * @param user 用户信息
     */
    @Transactional(propagation = Propagation.REQUIRED)
    void addWithRequiredAndException(User user);

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    void addWithRequiredNew(User user);

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    void addWithRequiredNewAndException(User user);

    @Transactional(propagation = Propagation.NESTED)
    void addWithNested(User user);

    @Transactional(propagation = Propagation.NESTED)
    void addWithNestedAndException(User user);
}
